const baseURL = "https://datav.aliyun.com/portal/school/atlas/area_selector";

const puppeteer = require("puppeteer");

const fs = require("fs");

const axios = require("axios");

async function initPuppeteer() {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto(baseURL);

  //   监听请求（首次加载没有请求）监听请求没有响应体，转为监听 响应
  //   page.on("request", (req) => {
  //     // 通过 url() 区分不同的请求,这个可以直接写死，也可以使用 正则匹配
  //     if (req.url() == "https://geo.datav.aliyun.com/areas_v3/bound/all.json")
  //       //   console.log(req.url());
  //       console.log(req.response().text());
  //   });

  page.on("response", async (res) => {
    if (
      res.request().url() ===
      "https://geo.datav.aliyun.com/areas_v3/bound/all.json"
    ) {
      const data = await res.text();
      saveFile(data, "all");
      // 暂时不请求 区级 数据，只请求 市级 和 省级
      const list = JSON.parse(data).filter((i) => i.level !== "district");
      saveFile(JSON.stringify(list), "no-district");
      queryJson(list);
    }
  });

  //   页面重新加载
  await page.reload();

  await browser.close();
}

// 请求各省市县json数据
async function queryJson(list) {
  if (!list.length) return;

  let index = 1;

  const all = list.length;

  for (const item of list) {
    const url = `https://geo.datav.aliyun.com/areas_v3/bound/${item.adcode}_full.json`;

    // 解析完整的父级名称，直到 parent 为 100000，得到的名称示例 北京市-大兴区

    var cItem = item;

    let parentName = cItem.name;

    while (cItem.parent !== 100000) {
      if (!cItem.parent) break;
      const parent = list.find((i) => i.adcode === cItem.parent);
      parentName = `${parent.name}-${parentName}`;
      cItem = parent;
    }

    const name = `${item.adcode}-${parentName}`;

    try {
      const { data } = await axios.get(url);
      // 输出正在请求的 序号 和总数
      console.log(`正在请求 ${index}/${all} ==> ${name}.json`);

      // 还要分离 省市县 到不同的文件
      saveJson(data, name, item.level);
      index++;
    } catch (error) {
      // 正在重试...
      try {
        const url = `https://geo.datav.aliyun.com/areas_v3/bound/${item.adcode}.json`;
        const { data } = await axios.get(url);
        console.error(`正在重试请求 ${index}/${all} ==> ${name}.json`);
        // 还要分离 省市县 到不同的文件
        saveJson(data, name, item.level);
        console.error("【重试请求成功！】");
      } catch (error) {
        console.error(`【重试失败！】`, item.level, item.name, item.adcode);
      }
    }
  }
}

// 转存为文件
function saveFile(data, filename) {
  fs.writeFile(`./demo/map_json/${filename}.json`, data, (err) => {
    if (err) throw new Error(err);
    console.log("## 文件写入成功");
  });
}

function saveJson(data, name, fileURL) {
  fs.writeFile(
    `./map-json/${fileURL}/${name}.json`,
    JSON.stringify(data),
    (err) => {
      if (err) {
        console.log("文件保存失败！！！");
        throw new Error(err);
      }
    }
  );
}

initPuppeteer();
